﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Windows.Media.Imaging;

using ServicioWPF.Componentes;

namespace ServicioWPF.Componentes
{
    class Datos
    {
        /*  
       * Constructor privado para asegurar que no se pueda crear un objeto de esta clase directamente.
       * La propiedad estática se encarga de crear un único objeto para toda la aplicación.
       */
        private Datos()
        {
        }

        static readonly Datos unicaInstancia = new Datos();

        public static Datos Aplicacion
        {
            get
            {
                return unicaInstancia;
            }
        }

        public void Actualizar(Usuario usuario)
        {
            var baseDatos = XElement.Load("Usuarios.xml");
            var elementos = baseDatos.Descendants("Usuario");

            // Linq2Xml
            var nodo = (from elemento in elementos
                        where elemento.Attribute("id").Value == usuario.ID.ToString()
                        select elemento).First();

            nodo.Element("Nombre").ReplaceNodes(usuario.Nombre);
            nodo.Element("Alias").ReplaceNodes(usuario.Alias);
            nodo.Element("Clave").ReplaceNodes(usuario.Clave);

            baseDatos.Save("Usuarios.xml");
        }

        public List<Usuario> ObtenerUsuarios()
        {
            var listaUsuarios = new List<Usuario>();

            var baseDatos = XElement.Load("Usuarios.xml");
            var elementos = baseDatos.Descendants("Usuario");

            // Linq2Xml
            var usuarios = from elemento in elementos
                           select new
                           {
                               Nombre = (string)elemento.Element("Nombre").Value,
                               Alias = (string)elemento.Element("Alias").Value,
                               Clave = (string)elemento.Element("Clave").Value,
                               ID = (string)elemento.Attribute("id").Value,
                               Avatar = (string)elemento.Element("Avatar").Value
                           };


            // Agregar los usuarios del archivo Xml a la colección de usuarios que está enlazada a la interfaz de usuario.
            foreach (var usuario in usuarios)
                listaUsuarios.Add(new Usuario(usuario.Nombre, usuario.Alias, usuario.Clave, int.Parse(usuario.ID), usuario.Avatar));

            return listaUsuarios;
        }

        public bool Autenticar(string alias, string clave, out string nombreUsuario)
        {
            nombreUsuario = String.Empty;
            XElement baseDatos = XElement.Load("Usuarios.xml");
            var elementos = baseDatos.Descendants("Usuario");

            var nombre = from elemento in elementos
                         where (elemento.Element("Alias").Value == alias) && (elemento.Element("Clave").Value == clave)
                         select (string)elemento.Element("Nombre").Value;

            if (nombre.Count() == 1)
            {
                nombreUsuario = nombre.First<string>();
                return true;
            }
            return false;
        }
    }
}
